package com.harzone.commons.search.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Table implements Serializable,Cloneable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String schemaName = "";
	private String name = "";
	// 别名
	private String alias = "";

	// 建立时间
	private Date createDate;

	// 备注
	private String remark = "";

	// 主键是否自动生成
	private boolean autoGenerateKey = true;

	// 列簇
	private List<Field> fields = new ArrayList<Field>();

	public Table(String name) {
		super();
		this.name = name;
	}

	public Table(String schemaName, String name) {
		super();
		this.schemaName = schemaName;
		this.name = name;
	}

	public Table addField(String name, Object value) {
		this.fields.add(new Field(name, value));
		return this;
	}

	public Table addField(String name) {
		this.fields.add(new Field(name));
		return this;
	}

	public Table addField(Field f) {
		this.fields.add(f);
		return this;
	}

	public String getAlias() {
		return alias;
	}

	public Table setAlias(String alias) {
		this.alias = alias;
		return this;
	}

	public Date getCreateDate() {
		return createDate;
	}

	public Table setCreateDate(Date createDate) {
		this.createDate = createDate;
		return this;
	}

	public String getRemark() {
		return remark;
	}

	public Table setRemark(String remark) {
		this.remark = remark;
		return this;
	}

	public boolean isAutoGenerateKey() {
		return autoGenerateKey;
	}

	public Table setAutoGenerateKey(boolean autoGenerateKey) {
		this.autoGenerateKey = autoGenerateKey;
		return this;
	}

	public List<Field> getFields() {
		return fields;
	}

	public Table setFields(List<Field> fields) {
		this.fields = fields;
		return this;
	}

	public int getVersion() {
		return version;
	}

	public Table setVersion(int version) {
		this.version = version;
		return this;
	}

	private int version = 0;

	public String getSchemaName() {
		return schemaName;
	}

	public Table setSchemaName(String schemaName) {
		this.schemaName = schemaName;
		return this;
	}

	public String getName() {
		return name;
	}

	public Table setName(String name) {
		this.name = name;
		return this;
	}

	@Override
	public String toString() {
		return "Table [schemaName=" + schemaName + ", name=" + name
				+ ", alias=" + alias + ", createDate=" + createDate
				+ ", remark=" + remark + ", autoGenerateKey=" + autoGenerateKey
				+ ", fields=" + fields.size() + ", version=" + version + "]";
	}

	public String string() {
		return "schemaName=" + schemaName + ", name=" + name + ", alias="
				+ alias + ", createDate=" + createDate + ", remark=" + remark
				+ ", autoGenerateKey=" + autoGenerateKey + ", version="
				+ version + "]";
	}

	/**
	 * 获取列集合的map对象<列名，列实体>
	 * 
	 * @author ls 2014年11月25日上午10:19:06
	 * @return
	 */
	public Map<String, Field> getFieldMap() {
		Map<String, Field> fieldMap = new LinkedHashMap<String, Field>();
		for (Field field : this.getFields()) {
			fieldMap.put(field.getName(), field);
		}
		return fieldMap;
	}

	/**
	 * 获取需要建立索引列集合的map对象<索引名，列实体>,键值为索引列名
	 * 
	 * @author ls 2014年11月25日上午10:18:59
	 * @return
	 */
	public Map<String, Field> getIndexMap() {
		Map<String, Field> indexMap = new LinkedHashMap<String, Field>();
		for (Field column : this.getFields()) {
			if (column.isCreateIndex() || column.isForeignkey()
					|| column.isPrimaryKey()) {
				indexMap.put(column.getIndexName(), column);
			}
		}
		return indexMap;
	}

	/**
	 * 获取需要建立索引列集合的map对象<列名，列实体>，键值为列名
	 * 
	 * @author ls 2014年11月25日上午10:18:51
	 * @return
	 */
	public Map<String, Field> getNameIndexMap() {
		Map<String, Field> indexMap = new LinkedHashMap<String, Field>();
		for (Field column : this.getFields()) {
			if (column.isCreateIndex() || column.isForeignkey()
					|| column.isPrimaryKey()) {
				indexMap.put(column.getName(), column);
			}
		}
		return indexMap;
	}

	/**
	 * 获取需要建立索引的列
	 * 
	 * @author ls 2014年11月25日上午10:19:51
	 * @return
	 */
	public List<Field> getIndexFields() {
		List<Field> indexList = new ArrayList<Field>();
		for (Field column : this.getFields()) {
			if (column.isCreateIndex() || column.isForeignkey()
					|| column.isPrimaryKey()) {
				// 主键列和搜索列都需要建立索引
				indexList.add(column);
			}
		}
		return indexList;
	}

	/**
	 * 获取列名列表
	 * 
	 * @author ls 2014年11月25日上午10:21:27
	 * @return
	 */
	public List<String> getFieldsStr() {
		List<String> columnsStr = new ArrayList<String>();
		for (Field column : this.getFields()) {
			columnsStr.add(column.getName());
		}
		return columnsStr;
	}

	/**
	 * 获取主键列
	 * 
	 * @author ls 2014年11月25日上午10:22:18
	 * @return
	 */
	public Field getPriKey() {
		Field priKey = null;
		for (Field column : this.getFields()) {
			if (column.isPrimaryKey()) {
				priKey = column;
				break;
			}
		}
		return priKey;
	}

	/**
	 * 获取外键列
	 * 
	 * @author ls 2014年11月25日上午10:22:22
	 * @return
	 */
	public Field getForKey() {
		Field priKey = null;
		for (Field column : this.getFields()) {
			if (column.isForeignkey()) {
				priKey = column;
				break;
			}
		}
		return priKey;
	}

	/**
	 * 根据名称获取列对象
	 * 
	 * @author ls 2014年11月25日上午10:23:58
	 * @param name
	 * @return
	 */
	public Field getField(String name) {
		Field field = null;
		for (Field col : this.getFields()) {
			if (col.getShowName().equals(name) || col.getName().equals(name)) {
				field = col;
				break;
			}
		}
		return field;
	}

	/**
	 * 获取索引列
	 * 
	 * @author ls 2014年11月25日上午10:23:42
	 * @param name
	 * @return
	 */
	public Field getIndexField(String name) {
		Field Field = null;
		for (Field col : this.getFields()) {
			if ((col.isPrimaryKey() || col.isForeignkey() || col
					.isCreateIndex()) 
					&& (col.getShowName().equals(name) || col.getName().equals(name))) {
				Field = col;
				break;
			}
		}
		return Field;
	}

	/**
	 * 获取索引名称
	 * 
	 * @author ls 2014年11月25日上午10:23:47
	 * @param name
	 * @return
	 */
	public String getIndexName(String name) {
		Field field = this.getIndexField(name);
		return field != null ? field.getIndexName() : "";
	}
}
